package com.shujia.scala

import scala.collection.mutable
import scala.io.{BufferedSource, Source}

object Demo04WordCntScala {
  def main(args: Array[String]): Unit = {
    // 1、读文件
    val bs: BufferedSource = Source.fromFile("scala/data/words.txt")

    // 2、遍历每一条数据
    val lineIter: Iterator[String] = bs.getLines()

    val wordCntMap: mutable.HashMap[String, Int] = new mutable.HashMap[String, Int]()


    for (line: String <- lineIter) {
      val wordArr: Array[String] = line.split(",")

      // 3、处理每一个单词
      for (word: String <- wordArr) {
        if (wordCntMap.contains(word)) {
          // 如果使用Scala中的HashMap，在通过key进行get操作时会返回Option类型
          // Option包含了两种情况：1、key存在即能取出value，则返回Some对象 2、key不存在则返回None对象
          wordCntMap.put(word, wordCntMap.getOrElse(word, 0) + 1)
        } else {
          wordCntMap.put(word, 1)
        }
      }
    }

    // 4、输出结果
    //    for (elem: (String, Int) <- wordCntMap) {
    //      println(s"${elem._1},${elem._2}")
    //    }

    // (f:((String,Int)) => U)
    /*
      f : 变量名
      ((String,Int)) => U : 变量(函数)的类型
      => 分隔符，左边是参数 右边一般是返回函数体，也可以是U（Unit没有返回值）
     */

    def myPrintln(any: Any): Unit = {
      println(any)
    }

    wordCntMap.foreach((any: (String, Int)) => {
      println(s"${any._1},${any._2}")
    })

    bs.close()

    // 读文件
    val bs2: BufferedSource = Source
      .fromFile("scala/data/words.txt")

    bs2
      // 将每行数据的每个单词切分出来并进行扁平化
      .getLines()
      .toList
      .flatMap(_.split(","))
      // 对每个单词进行分组
      .groupBy(word => word)
      // 对每个单词分好的组进行统计
      .map(kv => s"${kv._1},${kv._2.size}")
      .foreach(println)

    bs2.close()
  }

}
